<?php 

namespace app\Http;

class pay{

		 // ------------------------------交易接口------------------------------
    // 交易接口|辅助|配置信息
    public static function getdealconf(){
        return array(
            'appkey'=>'840771001',//应用Id: 华唯商标：httm
            'appsecret'=>'ec019445edaf0658672a31265db51846',//应用密匙
			
            'hostport'=>'http://pay.ma.cn/',//提交的接口地址
            'url_get_account'=>'api/user/account.do',//获取用户账户金额
            'url_fund_detail'=>'api/user/fund_detail.do',//获取用户详情
            'url_direct_pay'=>'api/trade/direct_pay.do',//即时扣款请求
            'url_confirm'=>'api/trade/confirm.do',//确认交易接口
            'url_cancel'=>'api/trade/cancel.do',//取消交易接口
            'url_refund'=>'api/user/refund.do',//退款申请接口
            'url_recharge'=>'api/recharge/recharge.do',//在线充值请求
            'url_draw'=>'api/draw/draw.do',//提款页面
			'url_pay' => 'api/trade/pay.do',
        );
    }
    // 交易接口|辅助|签名算法
    public static function getdealsign($param=array()){
        // 通过参数，密钥生成的MD5加密串
        // 请求示例：
        // http://localhost:8090/api/trade/pay.do?appkey=httm&outTradeNo=201509160001&amount=100&stamp=1442390463&sign=acb086134b3c0b265d85e9a59cae1a00

        // 参数:$param数组:拼接请求地址的参数
        //     :$param:

        // 返回值:return
        // $return = array('uri'=>'');//uri:拼接后的参数字符串信息

        $return = array();// 返回
        $query = $param;//query=整理后顺序的请求参数数组;
        // $uri = '';//uri=记录拼接的字符串;
        $current_time = time();
         $serven = new Pay();
        $return['conf'] = $conf = $serven->getdealconf();// 获取配置
        $appkey = $conf['appkey'];
        $appsecret = $conf['appsecret'];
        $return['stamp'] = $current_time;

        // 整理请求参数数组
        $str_query = "";
        $uri_query = "";
        if(!empty($query) && is_array($query)){
            ksort($query, SORT_STRING);//单元被作为字符串来比较
            foreach ($query as $key => $value) {
                // $str_query .= $key.$value;
                $str_query .= $key.urlencode($value);
                // $uri_query .= '&'.$key.'='.$value;
                $uri_query .= '&'.$key.'='.urlencode($value);//[mytest]:参数是否需要urlencode
            }
        }

        // 拼接: [$appkey]+[$str_query]+[stamp]+[$current_time]+[$appsecret]
        $all_str = $appkey.$str_query."stamp".$current_time.$appsecret;
        $return['sign'] = $sign = md5($all_str);//最后将拼接后的字符串进行MD5加密，生成签名
        $return['uri'] = 'appkey='.$appkey.$uri_query."&stamp=".$current_time."&sign=".$sign;
        // $return['uri'] = urlencode('appkey='.$appkey.$uri_query."&stamp=".$current_time."&sign=".$sign);

        return $return;
    }
		// 交易接口|连接|获取[在线充值请求页面]|
    public static function dodealrecharge($param=array()){
        // [在线充值请求]说明:
        //         api/recharge/recharge.do :在线充值请求页面
        //                     返回数据格式 :HTML
        //                     HTTP请求方式 :GET
        //                     是否需要登录 :是
        //           访问授权限制=>访问级别 :普通接口
        //           访问授权限制=>频次限制 :无
        // [在线充值请求]请求参数:
        //     参数名称    必选  类型范围    说明
        //      amount      否    Double      充值金额
        //      returnUrl   否    String      回调页面地址

        // [在线充值请求]返回结果:
        //             HTML

        // [函数]参数:$param
        //         :$param['amount']:充值金额
        //         :$param['returnUrl']:回调页面地址
        // [函数]返回值:$url:充值的url

        // // 组合接口参数
        $query = array();
        if($param['amount']){$query['amount'] = $param['amount'];}
        if($param['returnUrl']){$query['returnUrl'] = $param['returnUrl'];}
        $serven = new Pay();
        $ret = $serven->getdealsign($query);// 获取配置信息等
        $conf = $ret['conf'];
        $uri = $ret['uri'];
        $url = $conf['hostport'].$conf['url_recharge'].'?'.$uri;

        return $url;
    }

 // 交易接口|连接|执行[即时扣款接口]|即时交易-担保交易|
    public static function dodealdrtpay($param=array()){
        // [即时扣款接口]说明:
        //          api/trade/direct_pay.do :即时扣款请求
        //                     返回数据格式 :JSON
        //                     HTTP请求方式 :POST
        //                     是否需要登录 :否
        //           访问授权限制=>访问级别 :普通接口
        //           访问授权限制=>频次限制 :无
        // [即时扣款接口]请求参数:
        //     参数名称    必选  类型范围    说明
        //      type        是   String      交易类型:IMMEDIATE=即时交易,GUARANTEE=担保交易;
        //      amount      是   Double      交易金额
        //      outTradeNo  是   String      外部订单号
        //      userId      是   Int         用户ID
        //      remark      否   String      首次请求为商品描述, 追加交易为操作描述
        // [即时扣款接口]返回结果:
        //         Json示例
        //            成功：
        //            {                                // 返回字段    字段类型    说明
        //                "ret": 0,                    //   ret         int         请求执行状态码
        //                "msg": "success",            //   msg         String      执行结果信息
        //                "tradeNo":"A5465345",        //   tradeNo     String      内部订单号
        //                "outTradeNo":"B32154545"     //   outTradeNo  String      外部订单号
        //            }

        // [函数]参数:$param
        //         :$param['type']:交易类型:IMMEDIATE=即时交易,GUARANTEE=担保交易;
        //         :$param['price']:交易金额
        //         :$param['outTradeNo']:商标交易号
        //         :$param['uid']:会员ID
        //         :$param['remark']:交易描述
        // [函数]返回值:$return//ok:1=成功;0=失败;msg:记录失败信息;data:其他数据
        $return = array('ok'=>0, 'msg'=>'','data'=>array());
 		$serven = new Pay();
        // 组合接口参数
        $query = array();
        $query['type'] = $param['type'];//交易类型:IMMEDIATE=即时交易,GUARANTEE=担保交易;
        $query['amount'] = $param['price'];//交易金额
        $query['outTradeNo'] = $param['outTradeNo'];//外部订单号
        $query['userId'] = $param['uid'];//会员ID
        $query['remark'] = $param['remark'];//首次请求为商品描述, 追加交易为操作描述
        $ret = $serven->getdealsign($query);// 获取配置信息等
        $conf = $ret['conf'];
        $uri = $ret['uri'];

        // 请求路径
        $post = array('url'=>$conf['hostport'].$conf['url_direct_pay'],'query'=>$uri);

        $ret = $serven->getdealpost($post);// 调用接口获取返回信息;
        //var_dump($post,$ret);
        //exit;
        if(!$ret){
            $return['msg'] = "获取返回信息失败！";
            return $return;
        }
        $result = json_decode($ret, true);
        if($result['ret']==0 && $result['msg']=='success'){
            $return['ok'] = 1;
            $return['data'] = array('tradeNo'=>$result['tradeNo'],'outTradeNo'=>$result['outTradeNo']);
            return $return;
        }
        // 调用接口处理失败
        $return['msg'] = '交易失败';
        $return['data'] = $result;
        return $return;
    }

    // 交易接口|辅助|curl-post
    public function getdealpost($data=array()){
        // $data['query']:"apikey=$apikey&text=$encoded_text&mobile=$mobile"; 形式
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $data['url']);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data['query']);
        $res = curl_exec($ch);
        curl_close($ch);
        return $res;
    }


     // 交易接口|连接|获取[会员当前账户余额]
    public static function getdealaccount($param=array()){ 
        $serven = new Pay();
        // [获取用户账户金额]说明:
        //             api/user/account.do :获取用户账户金额
        //                     返回数据格式:JSON
        //                     HTTP请求方式:GET
        //                     是否需要登录:否
        //           访问授权限制=>访问级别:普通接口
        //           访问授权限制=>频次限制:无
        // [获取用户账户金额]请求参数:
        //     参数名称    必选  类型范围    说明
        //      userId      是    String      会员的ID
        // [获取用户账户金额]返回结果:
        //         Json示例
        //            成功：
        //            {                                // 返回字段          字段类型    说明
        //                "ret": 0,                    //   ret               int         请求执行状态码
        //                "msg": "success",            //   msg               String      执行结果信息
        //                "defaultAccount":91.00,      //   defaultAccount    String      普通账户余额（元）
        //                "lockAccount":10760.00       //   lockAccount       String      冻结账户余额（元）
        //            }

        // [函数]参数:$param
        //         :$param['uid']:传入会员ID
        // [函数]返回值:$return://ok:1=成功;0=失败;msg:记录失败信息;data:数组,其他数据,如:['defaultAccount']['lockAccount']
        $return = array('ok'=>0, 'msg'=>'','data'=>array());
        $uid = $param['uid'];
        if(!$uid){
            $return['msg'] = '传入会员ID验证错误！';
            return $return;
        }
       
        // 组合提交参数
        $query = array('userId'=>$uid);
        $ret = $serven->getdealsign($query);
        $conf = $ret['conf'];
        $uri = $ret['uri'];

        // 请求路径
        $url = $conf['hostport'].$conf['url_get_account']."?".$uri;
        $ret = $serven->getdealget($url);// 调用接口获取返回信息;
        if(!$ret){
            $return['msg'] = "获取返回信息失败！";
            return $return;
        }
        $result = json_decode($ret, true);
        if($result['ret']==0 && $result['msg']=='success'){
            $return['ok'] = 1;
            $return['data'] = array('defaultAccount'=>$result['defaultAccount'],'lockAccount'=>$result['lockAccount']);
            return $return;
        }
        // 失败
        $return['msg'] = '获取账户信息失败';
        $return['data'] = $result;
        return $return;
    }
     // 交易接口|辅助|curl-get
    public static function getdealget($url=''){
        return file_get_contents($url);
    }



}